/*********************************************************
*Copyright (c) 2015 zhongsx. All Rights in Pw 
*@des: 事件Timer 管理器
*@name: BEventTimer.h
*@author: zhongsx
*@time: 2015-02-13
*********************************************************/

#ifndef __BEVENT_TIMER_H_
#define __BEVENT_TIMER_H_

#include "Global.h"
#include <boost/thread.hpp>
#include <boost/asio.hpp>  
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/bind.hpp>  
#include <boost/function.hpp>
#include <boost/thread.hpp>

class AsyncTimer;
typedef  boost::function<void(boost::shared_ptr<AsyncTimer>& )> EndFunc;
typedef  boost::function<void()>	CallFunc;
//
class AsyncTimer: public boost::enable_shared_from_this<AsyncTimer>
{
public:	
	virtual ~AsyncTimer();
	/***********************************
	* 构造函数
	* ios io_service框架
	* func 注册事件
	* num 事件执行次数 <=-1 表示 永远执行 0 不执行 
	* microsec 距下次有多少秒
	**************************************/
	AsyncTimer(boost::asio::io_service& ios, int num, CallFunc func, 
		EndFunc endfc, int millsec);
	AsyncTimer(boost::asio::io_service& ios, int num, CallFunc func, 
		EndFunc endfc, std::string clock);
	
	/*********************************************
	*获取当前时间到定时时间的时间差
	*根据时间字符串(20:10:20或20:10:20.200), 
	*获取距下次到点的时间间隔 
	*精确到毫秒
	**********************************************/
	long getmillsec(std::string timing);

	void CallBack(const boost::system::error_code& ec);
private:
	int count;				//当前执行次数  
    int count_max;  		//执行最大次数
    long _millsec;		
	std::string _clock; //定时时间
    //function对象，持有一个参数无返回值的可调用物  
    CallFunc _func;
    EndFunc _end;
    boost::asio::deadline_timer _timer;  // asio定时器对象
};

class BEventTimer
{
public:
	BEventTimer();
	virtual ~BEventTimer();

	//
	void EndCallBack(boost::shared_ptr<AsyncTimer>& timer);
	//
	void SetEventListener(CallFunc _func, int num, long _millsec);
	void SetEventListener(CallFunc _func, int num, std::string _clock);
	//把定时器放到一个独立线程里
	void Run(boost::thread_group& group);

	static boost::shared_ptr<BEventTimer>& GetTimerInstance();
	static boost::shared_ptr<BEventTimer> pEventTimer; 
private:
	//BOOSTASIO 网络框架
	boost::asio::io_service ios; 
	//
	std::vector<boost::shared_ptr<AsyncTimer> > event_vec; 
	mutable boost::mutex 	_mutex;
};

#endif //__BEVENT_TIMER_H_
